<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>{foreach},{foreachelse}</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
<link rel="home" href="index.html" title="Smarty マニュアル">
<link rel="up" href="language.builtin.functions.html" title="Chapter 7. 組み込み関数">
<link rel="prev" href="language.function.config.load.html" title="{config_load}">
<link rel="next" href="language.function.if.html" title="{if},{elseif},{else}">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">{foreach},{foreachelse}</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="language.function.config.load.html">Prev</a> </td>
<th width="60%" align="center">Chapter 7. 組み込み関数</th>
<td width="20%" align="right"> <a accesskey="n" href="language.function.if.html">Next</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="sect1" title="{foreach},{foreachelse}">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="language.function.foreach"></a>{foreach},{foreachelse}</h2></div></div></div>
<p>
  <code class="varname">{foreach}</code> を使用して、通常の数値添字配列と同じように
   <span class="bold"><strong>連想配列</strong></span> をループします。
   <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>
  のように、<span class="bold"><strong>数値添字の配列のみ</strong></span> をループさせるということはありません。
   <code class="varname">{foreach}</code> の構文は
   <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>
   よりずっと簡単ですが、その代わりに <span class="bold"><strong>１つの配列</strong></span>
   しか扱えません。すべての <code class="varname">{foreach}</code> タグは、
   終了タグ <code class="varname">{/foreach}</code> とペアである必要があります。
   </p>
<div class="informaltable"><table border="1">
<colgroup>
<col align="center">
<col align="center">
<col align="center">
<col align="center">
<col>
</colgroup>
<thead><tr>
<th align="center">属性名</th>
<th align="center">型</th>
<th align="center">必須</th>
<th align="center">デフォルト</th>
<th>概要</th>
</tr></thead>
<tbody>
<tr>
<td align="center">from</td>
<td align="center">array</td>
<td align="center">Yes</td>
<td align="center"><span class="emphasis"><em>n/a</em></span></td>
<td>ループに使用する配列</td>
</tr>
<tr>
<td align="center">item</td>
<td align="center">string</td>
<td align="center">Yes</td>
<td align="center"><span class="emphasis"><em>n/a</em></span></td>
<td>現在の要素を示す変数の名前</td>
</tr>
<tr>
<td align="center">key</td>
<td align="center">string</td>
<td align="center">No</td>
<td align="center"><span class="emphasis"><em>n/a</em></span></td>
<td>現在のキーを示す変数の名前</td>
</tr>
<tr>
<td align="center">name</td>
<td align="center">string</td>
<td align="center">No</td>
<td align="center"><span class="emphasis"><em>n/a</em></span></td>
<td>foreach プロパティにアクセスするための foreach ループ名</td>
</tr>
</tbody>
</table></div>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
   必須の属性は <em class="parameter"><code>from</code></em> と <em class="parameter"><code>item</code></em> です。
   </p></li>
<li class="listitem"><p>
   <code class="varname">{foreach}</code> ループの <em class="parameter"><code>name</code></em>
   は、英数字とアンダースコアを使用して自由に命名できます。これは
    <a class="ulink" href="http://php.net/language.variables" target="_top">PHP の変数</a>
   と同じです。
   </p></li>
<li class="listitem"><p>
   <code class="varname">{foreach}</code> ループはネスト可能で、ネストした
   <code class="varname">{foreach}</code> の name はお互いにユニークである必要があります。
   </p></li>
<li class="listitem"><p>
   <em class="parameter"><code>from</code></em> 属性は、通常は値の配列で、
   <code class="varname">{foreach}</code> のループ回数を決定するために使われます。
   </p></li>
<li class="listitem"><p>
   <code class="varname">{foreachelse}</code> は、
   <em class="parameter"><code>from</code></em> 変数の値が存在しない場合に実行されます。
   </p></li>
<li class="listitem">
<p>
      <code class="varname">{foreach}</code> ループは、プロパティを操作する変数を自身で持っています。
      これらは次のように表されます。
      <a class="link" href="language.variables.smarty.html#language.variables.smarty.loops" title="{$smarty.section}、{$smarty.foreach}">
      <em class="parameter"><code>{$smarty.foreach.name.property}</code></em></a>
      ここで、<span class="quote">“<span class="quote">name</span>”</span> は
      <em class="parameter"><code>name</code></em> 属性の値となります。
      </p>
<div class="note" title="注意" style="margin-left: 0.5in; margin-right: 0.5in;">
<h3 class="title">注意</h3>
<p><em class="parameter"><code>name</code></em> 属性が必要となるのは
      <code class="varname">{foreach}</code> のプロパティにアクセスする必要がある場合のみです。
      これは <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>
      の場合とは異なります。<code class="varname">{foreach}</code> のプロパティに対して
      定義されていない <em class="parameter"><code>name</code></em> でアクセスしてもエラーは発生しませんが、
      結果は予測できない値になります。
      </p>
</div>
</li>
<li class="listitem"><p>
    <code class="varname">{foreach}</code> のプロパティには
    <a class="link" href="language.function.foreach.html#foreach.property.index" title=".index"><em class="parameter"><code>index</code></em></a>、
    <a class="link" href="language.function.foreach.html#foreach.property.iteration" title=".iteration"><em class="parameter"><code>iteration</code></em></a>、
    <a class="link" href="language.function.foreach.html#foreach.property.first" title=".first"><em class="parameter"><code>first</code></em></a>、
    <a class="link" href="language.function.foreach.html#foreach.property.last" title=".last"><em class="parameter"><code>last</code></em></a>、
    <a class="link" href="language.function.foreach.html#foreach.property.show" title=".show"><em class="parameter"><code>show</code></em></a>、
    <a class="link" href="language.function.foreach.html#foreach.property.total" title=".total"><em class="parameter"><code>total</code></em></a>
    があります。
    </p></li>
</ul></div>
<div class="example">
<a name="id2773201"></a><p class="title"><b>Example 7.5. <em class="parameter"><code>item</code></em> 属性</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$arr = array(1000, 1001, 1002);
$smarty-&gt;assign('myArray', $arr);
?&gt;

  </pre>
<p><em class="parameter"><code>$myArray</code></em> を順序なしリストで出力するテンプレート</p>
<pre class="programlisting">

&lt;ul&gt;
{foreach from=$myArray item=foo}
    &lt;li&gt;{$foo}&lt;/li&gt;
{/foreach}
&lt;/ul&gt;

  </pre>
<p>
   出力
  </p>
<pre class="screen">

&lt;ul&gt;
    &lt;li&gt;1000&lt;/li&gt;
    &lt;li&gt;1001&lt;/li&gt;
    &lt;li&gt;1002&lt;/li&gt;
&lt;/ul&gt;

  </pre>
</div>
</div>
<br class="example-break"><div class="example">
<a name="id2773253"></a><p class="title"><b>Example 7.6. <em class="parameter"><code>item</code></em> および <em class="parameter"><code>key</code></em> 属性の説明</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$arr = array(9 =&gt; 'Tennis', 3 =&gt; 'Swimming', 8 =&gt; 'Coding');
$smarty-&gt;assign('myArray', $arr);
?&gt;

  </pre>
<p><em class="parameter"><code>$myArray</code></em> を キー/値 のペアで出力するテンプレート。
   PHP の <a class="ulink" href="http://php.net/foreach" target="_top"><code class="varname">foreach</code></a> と似ています。</p>
<pre class="programlisting">

&lt;ul&gt;
{foreach from=$myArray key=k item=v}
   &lt;li&gt;{$k}: {$v}&lt;/li&gt;
{/foreach}
&lt;/ul&gt;

  </pre>
<p>
   出力
  </p>
<pre class="screen">

&lt;ul&gt;
    &lt;li&gt;9: Tennis&lt;/li&gt;
    &lt;li&gt;3: Swimming&lt;/li&gt;
    &lt;li&gt;8: Coding&lt;/li&gt;
&lt;/ul&gt;

  </pre>
</div>
</div>
<br class="example-break"><div class="example">
<a name="id2773322"></a><p class="title"><b>Example 7.7. {foreach} で連想配列の <em class="parameter"><code>item</code></em> 属性を指定する例</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$items_list = array(23 =&gt; array('no' =&gt; 2456, 'label' =&gt; 'Salad'),
                    96 =&gt; array('no' =&gt; 4889, 'label' =&gt; 'Cream')
                    );
$smarty-&gt;assign('items', $items_list);
?&gt;

  </pre>
<p><em class="parameter"><code>$items</code></em> と
   <em class="parameter"><code>$myId</code></em> を url に出力するテンプレート</p>
<pre class="programlisting">

&lt;ul&gt;
{foreach from=$items key=myId item=i}
  &lt;li&gt;&lt;a href="item.php?id={$myId}"&gt;{$i.no}: {$i.label}&lt;/li&gt;
{/foreach}
&lt;/ul&gt;

  </pre>
<p>
   出力
  </p>
<pre class="screen">

&lt;ul&gt;
  &lt;li&gt;&lt;a href="item.php?id=23"&gt;2456: Salad&lt;/li&gt;
  &lt;li&gt;&lt;a href="item.php?id=96"&gt;4889: Cream&lt;/li&gt;
&lt;/ul&gt;

  </pre>
</div>
</div>
<br class="example-break"><div class="example">
<a name="id2773385"></a><p class="title"><b>Example 7.8. {foreach} で <em class="parameter"><code>item</code></em> と <em class="parameter"><code>key</code></em> をネストする例</b></p>
<div class="example-contents">
<p>配列を Smarty に割り当てます。key にはループする値のキーが含まれます。</p>
<pre class="programlisting">

&lt;?php
 $smarty-&gt;assign('contacts', array(
                             array('phone' =&gt; '1',
                                   'fax' =&gt; '2',
                                   'cell' =&gt; '3'),
                             array('phone' =&gt; '555-4444',
                                   'fax' =&gt; '555-3333',
                                   'cell' =&gt; '760-1234')
                             ));
?&gt;

  </pre>
<p><em class="parameter"><code>$contact</code></em> を出力するテンプレート</p>
<pre class="programlisting">

{foreach name=outer item=contact from=$contacts}
  &lt;hr /&gt;
  {foreach key=key item=item from=$contact}
    {$key}: {$item}&lt;br /&gt;
  {/foreach}
{/foreach}

  </pre>
<p>
   出力
  </p>
<pre class="screen">

&lt;hr /&gt;
  phone: 1&lt;br /&gt;
  fax: 2&lt;br /&gt;
  cell: 3&lt;br /&gt;
&lt;hr /&gt;
  phone: 555-4444&lt;br /&gt;
  fax: 555-3333&lt;br /&gt;
  cell: 760-1234&lt;br /&gt;

  </pre>
</div>
</div>
<br class="example-break"><div class="example">
<a name="id2773464"></a><p class="title"><b>Example 7.9. データベースを使用する {foreachelse} の例</b></p>
<div class="example-contents">
<p>データベース (PEAR や ADODB など) を検索する例で、クエリの結果を Smarty に割り当てます。</p>
<pre class="programlisting">

&lt;?php
  $search_condition = "where name like '$foo%' ";
  $sql = 'select contact_id, name, nick from contacts '.$search_condition.' order by name';
  $smarty-&gt;assign('results', $db-&gt;getAssoc($sql) );
?&gt;

  </pre>
<p>結果がない場合に、<code class="varname">{foreachelse}</code>
  を使用して <span class="quote">“<span class="quote">見つかりません</span>”</span> と表示するテンプレート</p>
<pre class="programlisting">

{foreach key=cid item=con from=$results}
    &lt;a href="contact.php?contact_id={$cid}"&gt;{$con.name} - {$con.nick}&lt;/a&gt;&lt;br /&gt;
{foreachelse}
    検索結果が見つかりませんでした
{/foreach}

  </pre>
</div>
</div>
<br class="example-break"><div class="sect2" title=".index">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.index"></a>.index</h3></div></div></div>
<p>
   <em class="parameter"><code>index</code></em> には、現在の配列のインデックスをゼロから数えた値が含まれます。
  </p>
<div class="example">
<a name="id2773543"></a><p class="title"><b>Example 7.10. <em class="parameter"><code>index</code></em> の例</b></p>
<div class="example-contents"><pre class="programlisting">

{* ヘッダブロックを５行おきに出力します *}
&lt;table&gt;
{foreach from=$items key=myId item=i name=foo}
  {if $smarty.foreach.foo.index % 5 == 0}
     &lt;tr&gt;&lt;th&gt;タイトル&lt;/th&gt;&lt;/tr&gt;
  {/if}
  &lt;tr&gt;&lt;td&gt;{$i.label}&lt;/td&gt;&lt;/tr&gt;
{/foreach}
&lt;/table&gt;

  </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title=".iteration">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.iteration"></a>.iteration</h3></div></div></div>
<p>
   <em class="parameter"><code>iteration</code></em> は現在のループが反復された回数を表示します。
   <a class="link" href="language.function.foreach.html#foreach.property.index" title=".index"><em class="parameter"><code>index</code></em></a>
   とは異なり、常に 1 から始まります。
   各ループごとに 1 ずつ加算されます。
  </p>
<div class="example">
<a name="id2773606"></a><p class="title"><b>Example 7.11. <em class="parameter"><code>iteration</code></em> および <em class="parameter"><code>index</code></em> の例</b></p>
<div class="example-contents"><pre class="programlisting">

{* この出力は 0|1, 1|2, 2|3, ... のようになります *}
{foreach from=$myArray item=i name=foo}
{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
{/foreach}

  </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title=".first">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.first"></a>.first</h3></div></div></div>
<p>
   <em class="parameter"><code>first</code></em> は、現在の <code class="varname">{foreach}</code>
   の反復が最初のものであるときに <code class="constant">TRUE</code> となります。
  </p>
<div class="example">
<a name="id2773668"></a><p class="title"><b>Example 7.12. <em class="parameter"><code>first</code></em> プロパティの例</b></p>
<div class="example-contents"><pre class="programlisting">

{* 最初の項目には「最新」、それ以外は id を表示します *}
&lt;table&gt;
{foreach from=$items key=myId item=i name=foo}
&lt;tr&gt;
  &lt;td&gt;{if $smarty.foreach.foo.first}最新{else}{$myId}{/if}&lt;/td&gt;
  &lt;td&gt;{$i.label}&lt;/td&gt;
&lt;/tr&gt;
{/foreach}
&lt;/table&gt;

  </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title=".last">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.last"></a>.last</h3></div></div></div>
<p>
   <em class="parameter"><code>last</code></em> は、現在の <code class="varname">{foreach}</code>
   の反復が最後のものであるときに <code class="constant">TRUE</code> となります。
  </p>
<div class="example">
<a name="id2773725"></a><p class="title"><b>Example 7.13. <em class="parameter"><code>last</code></em> プロパティの例</b></p>
<div class="example-contents"><pre class="programlisting">

{* 一覧の最後に横罫線を追加します *}
{foreach from=$items key=part_id item=prod name=products}
  &lt;a href="#{$part_id}"&gt;{$prod}&lt;/a&gt;{if $smarty.foreach.products.last}&lt;hr&gt;{else},{/if}
{foreachelse}
  ... コンテンツ ...
{/foreach}

  </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title=".show">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.show"></a>.show</h3></div></div></div>
<p>
   <em class="parameter"><code>show</code></em> は <code class="varname">{foreach}</code> のパラメータとして使用します。
   <em class="parameter"><code>show</code></em> は boolean 値です。
   <code class="constant">FALSE</code> の場合は <code class="varname">{foreach}</code> は表示されず、
   もし <code class="varname">{foreachelse}</code> が存在すれば、それが代わりに表示されます。
  </p>
</div>
<div class="sect2" title=".total">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.total"></a>.total</h3></div></div></div>
<p>
   <em class="parameter"><code>total</code></em> には、
   <code class="varname">{foreach}</code> がループするトータル回数が含まれます。
   これは、<code class="varname">{foreach}</code> の内部だけではなく
   ループを抜けた後でも使用できます。
  </p>
<div class="example">
<a name="id2773832"></a><p class="title"><b>Example 7.14. <em class="parameter"><code>total</code></em> プロパティの例</b></p>
<div class="example-contents"><pre class="programlisting">

{* 返された行の総数を最後に表示します *}
{foreach from=$items key=part_id item=prod name=foo}
{$prod.name}&lt;hr/&gt;
{if $smarty.foreach.foo.last}
  &lt;div id="total"&gt;{$smarty.foreach.foo.total} items&lt;/div&gt;
{/if}
{foreachelse}
 ... 別の内容 ...
{/foreach}

  </pre></div>
</div>
<br class="example-break"><p>
   <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>
   および  <a class="link" href="language.variables.smarty.html#language.variables.smarty.loops" title="{$smarty.section}、{$smarty.foreach}"><em class="parameter"><code>$smarty.foreach</code></em></a>
   も参照してください。
  </p>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="language.function.config.load.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="language.builtin.functions.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="language.function.if.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">{config_load} </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> {if},{elseif},{else}</td>
</tr>
</table>
</div>
</body>
</html>
